<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category LIBRARY
   * @package LIBRARY/CORE.
   * @since 31/03/2012.
   * @last_update 31/03/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Core_ValidaFormulario{
    private $errors;
    protected $validator;
    
    /**
     * Método validaFormulario - Validação de campos campos do formulario.
     * 
     * @param array   Filtros aplicados na validação
     * @param array   Campos que devem ser validados.
     * @param array   Opções de validação.
     * 
     * @return object.
     */
    public function validaFormulario($filters='', $validators='', $options=''){
      $data = $_POST;
      $input = new Zend_Filter_Input($filters, $validators, $data, $options);
      if($input->hasInvalid() || $input->hasMissing()){
        foreach($input->getMessages() as $campo => $message){
          foreach($message as $mensagem){
            if(strpos($mensagem, "empty")){
            	throw new Exception("O campo {$campo} não pode ser vazio!", "3");
              //throw new Core_FormException("O campo {$campo} não pode ser vazio!", 3, 'javascript:history.back();');
            }
            else{
              throw new Exception("{$mensagem}", "4");
              //throw new Core_FormException("{$mensagem}", 3, 'javascript:history.back();');
            }
          }
        }
      }
      return $input;
    }
    
    /**
     * Valida o valor de acordo com seu tipo.
     * 
     * @param string  Nome do campo onde deverá validar valor.
     * @param string  Valor para validação.
     * @param string  Tipo de validação. Tipos possíveis: Num(Numerico), AlNum(AlphaNumerico), Email, Money, Data por checkdate, data por Mktime, Customizado.
     * @param string  No caso de Custom, deverá ser informado a expressão regular.
     * 
     * @return bool
     */
    public function isValid($field = '', $value = '', $type = '', $customValidator = ''){
      $this->errors = false;
      switch($type){
        case "Num":
          if(!$this->validNumber($value)){ 
            $this->errors = true; 
          }
        break;
        case "AlNum":
          if(!$this->validAlNum($value)){ 
            $this->errors = true; 
          }
        break;
        case "Alpha":
          if(!$this->validAlpha($value)){ 
            $this->errors = true; 
          }
        break;  
        case "Email":
          if(!$this->validEmail($value)){ 
            $this->errors = true; 
          }
        break;
        case "Money":
          if(!$this->validMoney($value)){ 
            $this->errors = true; 
          }
        break;
        case "Custom":
          if(!$this->validCustom($value, $customValidator)){ 
            $this->errors = true; 
          }
        break;
        case "Date":
          if (!$this->validDate($value, $void)) { $this->errors = true; }
        break;
        case "Date_MKT":
          if (!$this->validDateMkt($value, $void)) { $this->errors = true; }
        break;      
      }
      
      if($this->errors){ 
        return false; 
      }
      else{ 
        return true; 
      }
    }

    /**
     * Método validNumber - Verifica se o valor fornecido é composto apenas por números.
     * 
     * @param string Valor para validação.
     *  
     * @return bool.
     */
    public function validNumber($strValue) {
      $boolValidate = true;
      if(empty($strValue)){
        $boolValidate = false; 
      }
      else{
        if(!preg_match('/[0-9]/', $strValue)){ 
        	$boolValidate = false;
        }
      }
      return $boolValidate;
    }
    
    /**
     * Verifica se o valor fornecido é composto por números e/ou letras.
     * 
     * @param string  Valor para validação
     * 
     * @return bool
     */
    public function validAlNum($strValue){
      $boolValidate = true;
      if(empty($strValue)){
        $boolValidate = false; 
      } 
      else{
        if(!preg_match('/[A-Za-z0-9ÁÀÂÃÉÊÍÓÔÕÚÜÇáàâãéêíóôõúüç ]/', $strValue)){ 
          $boolValidate = false; 
        }
      }
      return $boolValidate;
    }    
    
    /**
     * Verifica se o valor fornecido é composto apenas por letras.
     * 
     * @param string  Valor para validação
     * 
     * @return bool
     */
    public function validAlpha($strValue){
      $boolValidate = true;
      if(empty($strValue)){
        $boolValidate = false;
      } 
      else{
        if(!preg_match('/[A-Za-zÁÀÂÃÉÊÍÓÔÕÚÜÇáàâãéêíóôõúüç ]/', $strValue)){ 
          $boolValidate = false; 
        } 
      }
      return $boolValidate;
    } 

    /**
     * Verifica se o valor fornecido é um e-mail válido.
     * 
     * @param string  E-mail a ser validado
     * 
     * @return bool
     */
    private function validEmail($value) {
      $validate = true;
      if(empty($value)){
        $validate = false;
      } 
      else{
        if(!preg_match("/^[a-zA-Z0-9_\.-]{1,}@[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]{2,}[\.]{0,}[A-Za-z0-9_-]{0,}/", $value)){ 
          $validate = false; 
        } 
      }
      return $validate;
    }     
    
    /**
     * Valida um valor monetário.
     * 
     * @param string  Valor monetário.
     * 
     * @return bool.
     */
    public function validMoney($value){
      $validate = true;
      if(empty($value)){
        $validate = false;
      } 
      else{
        if(preg_match('/^[0-9\.\,]/', $value)){ 
          $validate = true; 
        } 
      }
      return $validate;
    } 
    
    /**
     * Verifica se o valor fornecido é um valor válido de acordo com a regexp.
     * 
     * @param string  Valor a ser validado.
     * @param string  expressão regular.
     * 
     * @return bool.
     */
    public function validCustom($value, $custom) {
      $validate = true;
      if(empty($value)){
        $validate = false;
      } 
      else{
        if(preg_match('/' . $custom . '/', $value)){ 
          $validate = true; 
        } 
      }
      return $validate;
    } 
    
    /**
     * Verifica se a data inicial é maior que a data final.
     * 
     * @param date  Data Inicial no formato dd/mm/YYYY ou dd-mm-YYYY.
     * @param date  Data Final no formato dd/mm/YYYY ou dd-mm-YYYY.
     * 
     * @return bool
     */
    public function validDates($value1, $value2){
      $validate = true;
      if(empty($value1) || empty($value2)){
        $validate = false; 
      } 
      else{
        $data1 = split("[-,/]", $value1);
        $data1 = mktime(0, 0, 0, $data1[1], $data1[0], $data1[2]); 
        
        $data2 = split("[-,/]", $value2);
        $data2 = mktime(0, 0, 0, $data2[1], $data2[0], $data2[2]);
        if($data1 < $data2){ 
          $validate = false; 
        } 
      }
      return $validate;
    } 
    
    /**
     * Verifica se a data1 é maior que a data2.
     * 
     * @param date  Data1 no formato YYYY-mm-dd.
     * @param date  Data2 no formato YYYY-mm-dd.
     * 
     * @return bool
     */
    public static function validDatesFromDatabase($strValue1, $strValue2){
      $bollValidate = true;
      if(empty($strValue1) || empty($strValue2)){
        $bollValidate = false; 
      } 
      else{
        $arrValue1 = split("[ ]", $strValue1);
        $arrData1 = split("[-]", $arrValue1[0]);
        $arrHora1 = split("[:]", $arrValue1[1]);
        $strData1 = mktime($arrHora1[0], $arrHora1[1], $arrHora1[2], $arrData1[1], $arrData1[2], $arrData1[0]); 
        
        $arrValue2 = split("[ ]", $strValue2);
        $arrData2 = split("[-]", $arrValue2[0]);
        $arrHora2 = split("[:]", $arrValue2[1]);
        $strData2 = mktime($arrHora2[0], $arrHora2[1], $arrHora2[2], $arrData2[1], $arrData2[2], $arrData2[0]);
        
        if($strData1 < $strData2){
          $bollValidate = false; 
        } 
      }
      return $bollValidate;
    } 
    
    /**
     * Verifica se ultrapassou o limite de anos informado.
     * 
     * @param date    Data Inicial no formato dd/mm/YYYY ou dd-mm-YYYY.
     * @param date    Data Final no formato dd/mm/YYYY ou dd-mm-YYYY.
     * @param string  Quantidade de anos.
     * 
     * @return bool
     */
    public function validPeriodo($value1, $value2, $anos){
      $validate = true;
      if(empty($value1) || empty($value2) || empty($anos)){
        $validate = false; 
      } 
      else{
        $anos = (int)$anos;
        $data1 = split("[-,/]", $value1);
        $data1 = mktime(0, 0, 0, $data1[1], $data1[0], $data1[2]); 
        $data2 = split("[-,/]", $value2);
        $data2 = mktime(0, 0, 0, $data2[1], $data2[0], $data2[2]);
        $data = $data2 - $data1;
        if($data > ($anos * 31536000)){ 
          $validate = false; 
        } 
      }
      return $validate;
    }
    
    /**
     * Verifica por checkdate,se o valor fornecido é uma data válida.
     *  
     * @param date  Data a ser validada.
     * 
     * @return bool
     */
    public function validDateByCheckDate($value){
      $validate = true;
      if(empty($value)){
        $validate = false; 
      } 
      else{
        $data = split("[-,/]", $value);
        if(!checkdate($data[1], $data[0], $data[2]) and !checkdate($data[1], $data[2], $data[0])){ 
          $validate = false; 
        } 
      }
      return $validate;
    } 
    
    /**
     * Verifica por mktime, se o valor fornecido é uma data válida.
     * 
     * @param date  Data a ser validada.
     * 
     * @return bool
     */
    public function validDateByMktime($value){
      $validate = true;
      if(empty($value)){
        $validate = false; 
      } 
      else{
        $data = split("[-,/]", $value);
        if(!mktime(0, 0, 0, $data[1], $data[0], $data[2]) and !mktime(0, 0, 0, $data[1], $data[2], $data[0])){
          $validate = false; 
        } 
      }
      return $validate;
    }    
  }